/**
 * Prevent repeated clicks
 * @Example v-repeat-click="()=>{}"
 */
import { on, once } from '/@/utils/domUtils';
import type { Directive, DirectiveBinding } from 'vue';

const repeatDirective: Directive = {
   beforeMount(el: Element, binding: DirectiveBinding<any>) {
      let interval: Nullable<IntervalHandle> = null;
      let startTime = 0;
      const handler = (): void => binding?.value();
      const clear = (): void => {
         if (Date.now() - startTime < 100) {
            handler();
         }
         interval && clearInterval(interval);
         interval = null;
      };

      on(el, 'mousedown', (e: MouseEvent): void => {
         if ((e as any).button !== 0) return;
         startTime = Date.now();
         once(document as any, 'mouseup', clear);
         interval && clearInterval(interval);
         interval = setInterval(handler, 100);
      });
   },
};

export default repeatDirective;
